package controlsystem;
/*
 * AlertController is een classe die een waarschuwing geeft als je een week niet of te weinig aan een vak hebt gewerkt.
 * @author Christiaan Leysen
 * 
 */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Date;
import java.util.Calendar;

import tracksystem.SchoolActivity;
import tracksystem.Activity;
import managesystem.Student;


public class AlertController {
private ArrayList<Course> courses = new ArrayList<Course>();
private Student currStud;

/*
 *Constructor
 */
public AlertController()
{
	courses=currStud.getCourses();
}


/*
 * methode om een alert te geven voor alle vakken waarvoor er te weinig is gebeurt
 * @return void
 */
public ArrayList<Alert> returnAlert()
{   Calendar calendar=Calendar.getInstance();
    Date vandaag = calendar.getTime();
    ArrayList<Alert> alerts = new ArrayList<Alert>();
	ArrayList<SchoolActivity> activities =  getSchoolAct();
	Iterator<SchoolActivity> it = activities.iterator();
    while (it.hasNext()) {
    	double verschil=calculateTime(it.next().getCourse().getName());
    	Course vak = it.next().getCourse();
    	if(verschil>=5)
    	{
    	alerts.add(new Alert(vak,"u staat meer dan 5 uur achter op het standaardschema.",vandaag,false));
    	}
    	long weekTijd=calculateWeekTime(it.next().getCourse().getName());
    	if (weekTijd==0)
    	{
    		alerts.add(new Alert(vak,"U heeft deze week niet aan "+vak.getName()+" gewerkt.",vandaag,false));
    	}
    }
    
    return alerts;
}

/*
 * methode om de standaard spendeertijd van de vakken aan te roepen
 * @return void
 */
public double getEstTime(String courseName)
{   Calendar calendar=Calendar.getInstance();
	double time=0;
    Date vandaag = calendar.getTime();
	Calendar beginSj = Calendar.getInstance(); //beginSj is beginSchooljaar
	beginSj.set(Calendar.MONTH,Calendar.SEPTEMBER);
	beginSj.set(Calendar.YEAR,calendar.get(Calendar.YEAR));
	beginSj.set(Calendar.DAY_OF_MONTH,1);
	Date begin= beginSj.getTime();
	long diff = vandaag.getTime() - begin.getTime();
	long verschil= diff/(1000*60*60*24);
	Iterator<Course> it = courses.iterator();
	while (it.hasNext()) {
      if(it.next().getName().equals(courseName))
      {
    	  time =it.next().getStudyPoints()*27.5*(verschil/(13*7));
    	  
      }
      }
    
	 return time;
}


/*
 * methode die het verschil tussen de echte spendeertijd van de student en de 
 * standaard spendeertijd van de vakken berekent
 * @return void
 */
private double calculateTime(String courseName)
{   double verschil= 0;
	Iterator<Course> it = courses.iterator();
    while (it.hasNext()) {
      if(it.next().getName().equals(courseName))
      {
    	verschil = getEstTime(courseName)-calculateSpendTime(courseName);	  
      }
      }
    return verschil;
}

/*
 * methode die de totaal gespendeerde tijd per vak berekend 
 * standaard spendeertijd van de vakken berekent
 * @return long met het aantal milliseconde dat de gebruiker aan het vak heeft gespendeerd
 */
private long calculateSpendTime(String courseName)
{   long total=0;
   


	Iterator<SchoolActivity> it=  getSchoolAct().iterator();
    while (it.hasNext()) {
      if(it.next().getCourse().getName().equals(courseName))
      {
    	  total+=it.next().getDuration();
    	  
      }
      }
    return total;
}
/*
 * methode die het aantal uur gespendeerd aan een vak deze week berekend
 * @return long met het aantal uur gependeerd deze week voor het vak
 */
private long calculateWeekTime(String courseName)
{   long total = 0;
    Calendar calendar= Calendar.getInstance();
    Date vandaag = calendar.getTime();
  
    Iterator<SchoolActivity> it =  getSchoolAct().iterator();
    while (it.hasNext()) {
      if(it.next().getCourse().getName().equals(courseName))
      {
    	 //bepaal hoeveel de student deze week voor dit vak heeft gestudeerd 
       if(it.next().getStart().getTime()>=vandaag.getTime()-7*24*60*60*1000)
    	  total+=it.next().getDuration();
    	  
      }
      }
    return total/(60*60*1000);
}

/*
 * methode om enkel een arraylist van schoolActivities te hebben i.p.v. activities
 * @return een arraylist met SchoolActivities
 */
private ArrayList<SchoolActivity> getSchoolAct()
{
	ArrayList<SchoolActivity> schoolAct = new ArrayList<SchoolActivity>();
    Iterator<Activity> it = currStud.getActivities().iterator();
   while (it.hasNext()) {
	  if(it.next() instanceof SchoolActivity){
		  schoolAct.add((SchoolActivity) it.next());
		  
	  }
   }
   return schoolAct;

}
}